package cl.gob.minvu.catastromobile.dao;

import java.util.List;

import cl.gob.minvu.catastromobile.delegate.ComunaDelegate;
import cl.gob.minvu.catastromobile.entities.Comuna;
import cl.gob.minvu.catastromobile.util.GenericUtil;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;

/**
 * @author psep
 * 
 */
public class DatabaseHelper extends SQLiteOpenHelper {

	/**
	 * @param context
	 */
	public DatabaseHelper(Context context) {
		super(context, GenericUtil.DB_NAME, null, 3);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		this.installUserTable(db);
		this.installComunaTable(db);
		this.installFichaTable(db);
	}
	
	/**
	 * @param db
	 */
	private void installFichaTable(SQLiteDatabase db) {
		StringBuilder sql = new StringBuilder();
		sql.append("CREATE TABLE ");
		sql.append(FichaDAO.TABLE_FICHA);
		sql.append(" (");
		sql.append(FichaDAO.FIELDS_FICHA[0]);
		sql.append(" INTEGER PRIMARY KEY AUTOINCREMENT, ");
		sql.append(FichaDAO.FIELDS_FICHA[1]);
		sql.append(" TEXT, ");
		sql.append(FichaDAO.FIELDS_FICHA[2]);
		sql.append(" TEXT, ");
		sql.append(FichaDAO.FIELDS_FICHA[3]);
		sql.append(" INTEGER, ");
		sql.append(FichaDAO.FIELDS_FICHA[4]);
		sql.append(" TEXT)");
		this.execute(db, sql);
	}
	
	/**
	 * @param db
	 */
	private void installComunaTable(SQLiteDatabase db) {
		StringBuilder sql = new StringBuilder();
		sql.append("CREATE TABLE ");
		sql.append(ComunaDAO.TABLE_COMUNA);
		sql.append(" (");
		sql.append(ComunaDAO.FIELDS_COMUNA[0]);
		sql.append(" INTEGER, ");
		sql.append(ComunaDAO.FIELDS_COMUNA[1]);
		sql.append(" INTEGER, ");
		sql.append(ComunaDAO.FIELDS_COMUNA[2]);
		sql.append(" TEXT)");
		this.execute(db, sql);
		this.installDataComunas(db);
	}

	/**
	 * @param db
	 */
	public void installDataComunas(SQLiteDatabase db) {
		try {
			List<Comuna> comunas = new ComunaDelegate().getComunas();

			db.beginTransaction();

			StringBuilder sql = new StringBuilder();
			sql.append("INSERT INTO ");
			sql.append(ComunaDAO.TABLE_COMUNA);
			sql.append("(");
			sql.append(ComunaDAO.FIELDS_COMUNA[0]);
			sql.append(", ");
			sql.append(ComunaDAO.FIELDS_COMUNA[1]);
			sql.append(", ");
			sql.append(ComunaDAO.FIELDS_COMUNA[2]);
			sql.append(")  VALUES (?,?,?)");

			SQLiteStatement insert = db.compileStatement(sql.toString());

			for (Comuna comuna : comunas) {
				insert.bindLong(1, comuna.id);
				insert.bindLong(2, comuna.codRegion);
				insert.bindString(3, comuna.nombre);

				insert.execute();
			}

			db.setTransactionSuccessful();
		} catch (Exception e) {
			Log.e("error", e.getMessage());
		} finally {
			db.endTransaction();
		}
	}

	/**
	 * @param db
	 */
	private void installUserTable(SQLiteDatabase db) {
		Log.i("usuarioDAO", "creando la tabla");
		StringBuilder sql = new StringBuilder();
		sql.append("CREATE TABLE ");
		sql.append(UsuarioDAO.TABLE_USER);
		sql.append(" (");
		// run
		sql.append(UsuarioDAO.FIELDS_USER[0]);
		sql.append(" INTEGER, ");
		// dv
		sql.append(UsuarioDAO.FIELDS_USER[1]);
		sql.append(" TEXT, ");
		// email
		sql.append(UsuarioDAO.FIELDS_USER[2]);
		sql.append(" TEXT, ");
		// token
		sql.append(UsuarioDAO.FIELDS_USER[3]);
		sql.append(" TEXT, ");
		// profesion
		sql.append(UsuarioDAO.FIELDS_USER[4]);
		sql.append(" TEXT, ");
		// passwd
		sql.append(UsuarioDAO.FIELDS_USER[5]);
		sql.append(" TEXT, ");
		// region
		sql.append(UsuarioDAO.FIELDS_USER[6]);
		sql.append(" INTEGER, ");
		// comuna
		sql.append(UsuarioDAO.FIELDS_USER[7]);
		sql.append(" INTEGER, ");		
		// nombres
		sql.append(UsuarioDAO.FIELDS_USER[8]);
		sql.append(" TEXT, ");
		// paterno
		sql.append(UsuarioDAO.FIELDS_USER[9]);
		sql.append(" TEXT, ");
		// materno
		sql.append(UsuarioDAO.FIELDS_USER[10]);
		sql.append(" TEXT)");
		this.execute(db, sql);
	}

	/**
	 * @param db
	 */
	private void upgradeTable(SQLiteDatabase db, String tableName) {
		StringBuilder sql = new StringBuilder();
		sql.append("DROP TABLE IF EXISTS ");
		sql.append(tableName);
		this.execute(db, sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
		this.upgradeTable(db, UsuarioDAO.TABLE_USER);
		this.upgradeTable(db, ComunaDAO.TABLE_COMUNA);
		this.upgradeTable(db, FichaDAO.TABLE_FICHA);
		this.onCreate(db);
	}
	
	/**
	 * @param db
	 * @param sql
	 */
	public void execute(SQLiteDatabase db, StringBuilder sql) {
		db.execSQL(sql.toString());
	}

}
